package 多线程;

/**
 * Created By  醉美柳舞之众星捧月
 *
 * @author song
 * @date 2017/11/10 21:50
 */
public class SellTicket implements Runnable {
    private int ticketCount = 100;

    //用对象加锁    //对象有标志位 ,相当于锁子;   线程工作的时候会修改它的状态,下个线程来的时候就会等待这个标志位
    private Object obj = new Object();

    /**
     * Author song  醉美柳舞之众星捧月
     * Date & Time  2017/11/10 21:58
     * Description    卖票 : 操作共享资源
     */
    @Override
    public void run() {
        try {
            while (ticketCount > 0) {
                sellTicket();
                Thread.sleep(100);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void sellTicket() {
        //加锁   //  有线程标志位
        //   如果此处括号中不是对象而是this 表示任何任何任何都可以 ！！   this表示当前对象,当前new出来的对象
        synchronized (obj) {

            //  同步代码块  ;   锁 =====》》  对象
            //也可以把这个方法加锁,eg:      private synchronized void sellTicket() {}    ;如果是在方法上面加锁,那就是用的“this”对象加锁

            //当方法为静态方法的时候再加锁： private synchronized static void ... 相当于是类锁定; 相当于是上面括号里面的内容为(SellTicker.class)   加载到“类”上的锁子

            // 所有方法共享这一个方法 ; 他们共享这一个锁 ! 共享这一个锁 ！！ 这个类里所有的对象过来后都会来排队的 是都会来排队的！ 要同一个锁才会排队才会阻塞
            // 静态方法是类锁 类对象  ;   不是静态就是当前对象this


            if (ticketCount > 0) {
                ticketCount--;
                System.out.println(Thread.currentThread().getName() + " 卖票 还剩" + ticketCount + "张");
            } else {
                System.out.println(Thread.currentThread().getName() + "票卖完了");
            }
        }
    }
}
